/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Persistencia;

import Persistencia.exceptions.NonexistentEntityException;
import Persistencia.exceptions.PreexistingEntityException;
import java.io.Serializable;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Query;
import javax.persistence.EntityNotFoundException;
import javax.persistence.Persistence;
import javax.transaction.UserTransaction;
import motoressa.Egreso;
import motoressa.Ingreso;
import motoressa.Turno;
import motoressa.InformeDeDiagnostico;
import motoressa.OrdenDeReparacion;

/**
 *
 * @author HP
 */
public class OrdenDeReparacionJpaController implements Serializable {

    public OrdenDeReparacionJpaController(UserTransaction utx, EntityManagerFactory emf) {
        this.utx = utx;
        this.emf = emf;
    }
    private UserTransaction utx = null;
    private EntityManagerFactory emf = null;

    public OrdenDeReparacionJpaController() {
        emf=Persistence.createEntityManagerFactory("MotoresSAPU");
    }
    

    public EntityManager getEntityManager() {
        return emf.createEntityManager();
    }

    public void create(OrdenDeReparacion ordenDeReparacion) throws PreexistingEntityException, Exception {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Egreso miEgreso = ordenDeReparacion.getMiEgreso();
            if (miEgreso != null) {
                miEgreso = em.getReference(miEgreso.getClass(), miEgreso.getCodigo());
                ordenDeReparacion.setMiEgreso(miEgreso);
            }
            Ingreso miIngreso = ordenDeReparacion.getMiIngreso();
            if (miIngreso != null) {
                miIngreso = em.getReference(miIngreso.getClass(), miIngreso.getCodigo());
                ordenDeReparacion.setMiIngreso(miIngreso);
            }
            Turno miTurno = ordenDeReparacion.getMiTurno();
            if (miTurno != null) {
                miTurno = em.merge(miTurno);
                ordenDeReparacion.setMiTurno(miTurno);
            }
            InformeDeDiagnostico miInformeDeDiagnostico = ordenDeReparacion.getMiInformeDeDiagnostico();
            if (miInformeDeDiagnostico != null) {
                miInformeDeDiagnostico = em.getReference(miInformeDeDiagnostico.getClass(), miInformeDeDiagnostico.getCodigo());
                ordenDeReparacion.setMiInformeDeDiagnostico(miInformeDeDiagnostico);
            }
            em.persist(ordenDeReparacion);
            if (miEgreso != null) {
                OrdenDeReparacion oldMiOrdenDeReparacionOfMiEgreso = miEgreso.getMiOrdenDeReparacion();
                if (oldMiOrdenDeReparacionOfMiEgreso != null) {
                    oldMiOrdenDeReparacionOfMiEgreso.setMiEgreso(null);
                    oldMiOrdenDeReparacionOfMiEgreso = em.merge(oldMiOrdenDeReparacionOfMiEgreso);
                }
                miEgreso.setMiOrdenDeReparacion(ordenDeReparacion);
                miEgreso = em.merge(miEgreso);
            }
            if (miIngreso != null) {
                OrdenDeReparacion oldMiOrdenDeReparacionOfMiIngreso = miIngreso.getMiOrdenDeReparacion();
                if (oldMiOrdenDeReparacionOfMiIngreso != null) {
                    oldMiOrdenDeReparacionOfMiIngreso.setMiIngreso(null);
                    oldMiOrdenDeReparacionOfMiIngreso = em.merge(oldMiOrdenDeReparacionOfMiIngreso);
                }
                miIngreso.setMiOrdenDeReparacion(ordenDeReparacion);
                miIngreso = em.merge(miIngreso);
            }
            if (miTurno != null) {
                OrdenDeReparacion oldMiOrdenOfMiTurno = miTurno.getMiOrden();
                if (oldMiOrdenOfMiTurno != null) {
                    oldMiOrdenOfMiTurno.setMiTurno(null);
                    oldMiOrdenOfMiTurno = em.merge(oldMiOrdenOfMiTurno);
                }
                miTurno.setMiOrden(ordenDeReparacion);
                miTurno = em.merge(miTurno);
            }
            if (miInformeDeDiagnostico != null) {
                OrdenDeReparacion oldMiOrdenDeReparacionOfMiInformeDeDiagnostico = miInformeDeDiagnostico.getMiOrdenDeReparacion();
                if (oldMiOrdenDeReparacionOfMiInformeDeDiagnostico != null) {
                    oldMiOrdenDeReparacionOfMiInformeDeDiagnostico.setMiInformeDeDiagnostico(null);
                    oldMiOrdenDeReparacionOfMiInformeDeDiagnostico = em.merge(oldMiOrdenDeReparacionOfMiInformeDeDiagnostico);
                }
                miInformeDeDiagnostico.setMiOrdenDeReparacion(ordenDeReparacion);
                miInformeDeDiagnostico = em.merge(miInformeDeDiagnostico);
            }
            em.getTransaction().commit();
        } catch (Exception ex) {
            if (findOrdenDeReparacion(ordenDeReparacion.getCodigo()) != null) {
                throw new PreexistingEntityException("OrdenDeReparacion " + ordenDeReparacion + " already exists.", ex);
            }
            throw ex;
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void edit(OrdenDeReparacion ordenDeReparacion) throws NonexistentEntityException, Exception {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            OrdenDeReparacion persistentOrdenDeReparacion = em.find(OrdenDeReparacion.class, ordenDeReparacion.getCodigo());
            Egreso miEgresoOld = persistentOrdenDeReparacion.getMiEgreso();
            Egreso miEgresoNew = ordenDeReparacion.getMiEgreso();
            Ingreso miIngresoOld = persistentOrdenDeReparacion.getMiIngreso();
            Ingreso miIngresoNew = ordenDeReparacion.getMiIngreso();
            Turno miTurnoOld = persistentOrdenDeReparacion.getMiTurno();
            Turno miTurnoNew = ordenDeReparacion.getMiTurno();
            InformeDeDiagnostico miInformeDeDiagnosticoOld = persistentOrdenDeReparacion.getMiInformeDeDiagnostico();
            InformeDeDiagnostico miInformeDeDiagnosticoNew = ordenDeReparacion.getMiInformeDeDiagnostico();
            if (miEgresoNew != null) {
                miEgresoNew = em.getReference(miEgresoNew.getClass(), miEgresoNew.getCodigo());
                ordenDeReparacion.setMiEgreso(miEgresoNew);
            }
            if (miIngresoNew != null) {
                miIngresoNew = em.getReference(miIngresoNew.getClass(), miIngresoNew.getCodigo());
                ordenDeReparacion.setMiIngreso(miIngresoNew);
            }
            if (miTurnoNew != null) {
                miTurnoNew = em.merge(miTurnoNew);
                ordenDeReparacion.setMiTurno(miTurnoNew);
            }
            if (miInformeDeDiagnosticoNew != null) {
                miInformeDeDiagnosticoNew = em.getReference(miInformeDeDiagnosticoNew.getClass(), miInformeDeDiagnosticoNew.getCodigo());
                ordenDeReparacion.setMiInformeDeDiagnostico(miInformeDeDiagnosticoNew);
            }
            ordenDeReparacion = em.merge(ordenDeReparacion);
            if (miEgresoOld != null && !miEgresoOld.equals(miEgresoNew)) {
                miEgresoOld.setMiOrdenDeReparacion(null);
                miEgresoOld = em.merge(miEgresoOld);
            }
            if (miEgresoNew != null && !miEgresoNew.equals(miEgresoOld)) {
                OrdenDeReparacion oldMiOrdenDeReparacionOfMiEgreso = miEgresoNew.getMiOrdenDeReparacion();
                if (oldMiOrdenDeReparacionOfMiEgreso != null) {
                    oldMiOrdenDeReparacionOfMiEgreso.setMiEgreso(null);
                    oldMiOrdenDeReparacionOfMiEgreso = em.merge(oldMiOrdenDeReparacionOfMiEgreso);
                }
                miEgresoNew.setMiOrdenDeReparacion(ordenDeReparacion);
                miEgresoNew = em.merge(miEgresoNew);
            }
            if (miIngresoOld != null && !miIngresoOld.equals(miIngresoNew)) {
                miIngresoOld.setMiOrdenDeReparacion(null);
                miIngresoOld = em.merge(miIngresoOld);
            }
            if (miIngresoNew != null && !miIngresoNew.equals(miIngresoOld)) {
                OrdenDeReparacion oldMiOrdenDeReparacionOfMiIngreso = miIngresoNew.getMiOrdenDeReparacion();
                if (oldMiOrdenDeReparacionOfMiIngreso != null) {
                    oldMiOrdenDeReparacionOfMiIngreso.setMiIngreso(null);
                    oldMiOrdenDeReparacionOfMiIngreso = em.merge(oldMiOrdenDeReparacionOfMiIngreso);
                }
                miIngresoNew.setMiOrdenDeReparacion(ordenDeReparacion);
                miIngresoNew = em.merge(miIngresoNew);
            }
            if (miTurnoOld != null && !miTurnoOld.equals(miTurnoNew)) {
                miTurnoOld.setMiOrden(null);
                miTurnoOld = em.merge(miTurnoOld);
            }
            if (miTurnoNew != null && !miTurnoNew.equals(miTurnoOld)) {
                OrdenDeReparacion oldMiOrdenOfMiTurno = miTurnoNew.getMiOrden();
                if (oldMiOrdenOfMiTurno != null) {
                    oldMiOrdenOfMiTurno.setMiTurno(null);
                    oldMiOrdenOfMiTurno = em.merge(oldMiOrdenOfMiTurno);
                }
                miTurnoNew.setMiOrden(ordenDeReparacion);
                miTurnoNew = em.merge(miTurnoNew);
            }
            if (miInformeDeDiagnosticoOld != null && !miInformeDeDiagnosticoOld.equals(miInformeDeDiagnosticoNew)) {
                miInformeDeDiagnosticoOld.setMiOrdenDeReparacion(null);
                miInformeDeDiagnosticoOld = em.merge(miInformeDeDiagnosticoOld);
            }
            if (miInformeDeDiagnosticoNew != null && !miInformeDeDiagnosticoNew.equals(miInformeDeDiagnosticoOld)) {
                OrdenDeReparacion oldMiOrdenDeReparacionOfMiInformeDeDiagnostico = miInformeDeDiagnosticoNew.getMiOrdenDeReparacion();
                if (oldMiOrdenDeReparacionOfMiInformeDeDiagnostico != null) {
                    oldMiOrdenDeReparacionOfMiInformeDeDiagnostico.setMiInformeDeDiagnostico(null);
                    oldMiOrdenDeReparacionOfMiInformeDeDiagnostico = em.merge(oldMiOrdenDeReparacionOfMiInformeDeDiagnostico);
                }
                miInformeDeDiagnosticoNew.setMiOrdenDeReparacion(ordenDeReparacion);
                miInformeDeDiagnosticoNew = em.merge(miInformeDeDiagnosticoNew);
            }
             em.persist(ordenDeReparacion);
            em.getTransaction().commit();
        } catch (Exception ex) {
            String msg = ex.getLocalizedMessage();
            if (msg == null || msg.length() == 0) {
                int id = ordenDeReparacion.getCodigo();
                if (findOrdenDeReparacion(id) == null) {
                    throw new NonexistentEntityException("The ordenDeReparacion with id " + id + " no longer exists.");
                }
            }
            throw ex;
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void destroy(int id) throws NonexistentEntityException {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            OrdenDeReparacion ordenDeReparacion;
            try {
                ordenDeReparacion = em.getReference(OrdenDeReparacion.class, id);
                ordenDeReparacion.getCodigo();
            } catch (EntityNotFoundException enfe) {
                throw new NonexistentEntityException("The ordenDeReparacion with id " + id + " no longer exists.", enfe);
            }
            Egreso miEgreso = ordenDeReparacion.getMiEgreso();
            if (miEgreso != null) {
                miEgreso.setMiOrdenDeReparacion(null);
                miEgreso = em.merge(miEgreso);
            }
            Ingreso miIngreso = ordenDeReparacion.getMiIngreso();
            if (miIngreso != null) {
                miIngreso.setMiOrdenDeReparacion(null);
                miIngreso = em.merge(miIngreso);
            }
            Turno miTurno = ordenDeReparacion.getMiTurno();
            if (miTurno != null) {
                miTurno.setMiOrden(null);
                miTurno = em.merge(miTurno);
            }
            InformeDeDiagnostico miInformeDeDiagnostico = ordenDeReparacion.getMiInformeDeDiagnostico();
            if (miInformeDeDiagnostico != null) {
                miInformeDeDiagnostico.setMiOrdenDeReparacion(null);
                miInformeDeDiagnostico = em.merge(miInformeDeDiagnostico);
            }
            em.remove(ordenDeReparacion);
            em.getTransaction().commit();
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public List<OrdenDeReparacion> findOrdenDeReparacionEntities() {
        return findOrdenDeReparacionEntities(true, -1, -1);
    }

    public List<OrdenDeReparacion> findOrdenDeReparacionEntities(int maxResults, int firstResult) {
        return findOrdenDeReparacionEntities(false, maxResults, firstResult);
    }

    private List<OrdenDeReparacion> findOrdenDeReparacionEntities(boolean all, int maxResults, int firstResult) {
        EntityManager em = getEntityManager();
        try {
            Query q = em.createQuery("select object(o) from OrdenDeReparacion as o");
            if (!all) {
                q.setMaxResults(maxResults);
                q.setFirstResult(firstResult);
            }
            return q.getResultList();
        } finally {
            em.close();
        }
    }

    public OrdenDeReparacion findOrdenDeReparacion(int id) {
        EntityManager em = getEntityManager();
        try {
            return em.find(OrdenDeReparacion.class, id);
        } finally {
            em.close();
        }
    }

    public int getOrdenDeReparacionCount() {
        EntityManager em = getEntityManager();
        try {
            Query q = em.createQuery("select count(o) from OrdenDeReparacion as o");
            return ((Long) q.getSingleResult()).intValue();
        } finally {
            em.close();
        }
    }
    
}
